/**
 * 数据库配置接口
 */
export interface DatabaseConfig {
    /** 数据库名称 */
    name: string;
    /** 数据库路径 */
    path: string;
    /** 加密器 */
    encryptor?: IEncryptor;
}

/**
 * 缓存配置接口
 */
export interface CacheConfig {
    /** 是否启用缓存，默认开启 */
    enabled: boolean;
    /** 缓存过期时间（毫秒），默认 1 小时，设置为 0 表示不过期 */
    ttl?: number;
    /** 最大缓存条目数，默认 1000 */
    maxItems?: number;
}

/**
 * 表配置接口
 */
export interface TableConfig {
    /** 表名 */
    name: string;
    /** 是否使用 JSON 路径模式 */
    useJsonPath: boolean;
    /** 加密器 */
    encryptor?: IEncryptor;
    /** 序列化器 */
    serializer?: ISerializer;
    /** 索引配置 */
    indexes?: IndexConfig[];
    /** 文件扩展名（默认为.json） */
    extension?: string;
    /** 缓存配置 */
    cache?: CacheConfig;
}

/**
 * 加密器接口
 */
export interface IEncryptor {
    /** 加密数据 */
    encrypt(data: string): string;
    /** 解密数据 */
    decrypt(data: string): string;
}

/**
 * 序列化器接口
 */
export interface ISerializer {
    /** 序列化数据 */
    serialize(data: any[]): string;
    /** 反序列化数据 */
    deserialize(content: string): any[];
    /** 获取默认文件扩展名 */
    getDefaultExtension(): string;
}

/**
 * 索引配置接口
 */
export interface IndexConfig {
    /** 索引名称 */
    name: string;
    /** 索引字段 */
    fields: string[];
    /** 是否唯一索引 */
    unique?: boolean;
}

/**
 * 查询条件接口
 */
export interface QueryCondition {
    /** 字段名，支持 JSON 路径，例如 `foo.bar.baz` */
    field: string;
    /** 操作符 */
    operator: QueryOperator;
    /** 值 */
    value: any;
}

/**
 * 查询操作符枚举
 */
export enum QueryOperator {
    EQUALS = 'eq',
    NOT_EQUALS = 'ne',
    GREATER_THAN = 'gt',
    GREATER_THAN_OR_EQUALS = 'gte',
    LESS_THAN = 'lt',
    LESS_THAN_OR_EQUALS = 'lte',
    IN = 'in',
    NOT_IN = 'nin',
    LIKE = 'like'
}

/**
 * 事务配置接口
 */
export interface TransactionConfig {
    /** 事务ID */
    id: string;
    /** 超时时间（毫秒） */
    timeout?: number;
}

/**
 * 数据操作结果接口
 */
export interface OperationResult<T = any> {
    /** 是否成功 */
    success: boolean;
    /** 错误信息 */
    error?: string;
    /** 返回数据 */
    data?: T;
    /** 影响的行数 */
    affectedRows?: number;
}
